package analizadorLexico;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Scanner;

public class Lexico {
	//-------------------------
	//----    ATRIBUTOS    ----
	//-------------------------
	
	//Archivo de lectura
	private FileReader archivo;
	//Buffer de lectura donde se almacena el archivo
	private BufferedReader bReader;
	//Lista de tokens recibida desde el archivo
	private ArrayList<Token> listaTokens;
	//Automata que tokeniza las palabras del lenguaje
	private Automata automata;
	//String para mostrar el codigo en UI
	String codigoUI;
	
	
	
	//---------------------------
	//----    CONSTRUCTOR    ----
	//---------------------------
	public Lexico(String ruta) throws FileNotFoundException {
		archivo = new FileReader(ruta);
		bReader = new BufferedReader(archivo);
		listaTokens = new ArrayList<Token>();
		automata = new Automata();
		codigoUI="";
	}
	
	
	
	//------------------------
	//----    PUBLICOS    ----
	//------------------------
	
	//Metodo que lee el archivo y le va pasando palabras al automata, para recibir
	//posteriormente una lista de tokens
	public boolean leeArchivo() throws IOException, ErrorLexicoExcepcion {	
		int fila = 0, 
			columna;
		automata.resetea();
		
		while (bReader.ready()) { //bucle que lee linea a linea el fichero
			boolean esComentario = false;
			
			fila ++;
			columna = 0;
			
			String sReader = bReader.readLine();
			Scanner scanner = new Scanner(sReader);
			while (scanner.hasNext() && !esComentario) { //bucle que lee palabra a palabra la linea
				columna ++;
				
				String sScanner = scanner.next();
				automata.tokeniza(sScanner, fila, columna);
				
				if (automata.getListaToken().get(automata.getListaToken().size() - 1).getTipo() == Token.Tipo.comentario) {
					automata.borraUltimoElemento();
					esComentario = true;
				}
				
				listaTokens.addAll(automata.getListaToken());
				automata.resetea();
			}
			scanner.close();
		}
		bReader.close();
		archivo.close();
		return true;
	}
	
	//Metodo que devuelve la lista de tokens generada.
	public ArrayList<Token> devuelveListaTokens() {
		return listaTokens;
	}
	
	public static void main(String[] args) {
		//System.out.println(o);
		
		
		try {
			Lexico l = new Lexico("prueba.txt");
			l.leeArchivo();
			int i = 0;
			while ( i < l.listaTokens.size()) {
				System.out.println(l.listaTokens.get(i).toString());
				
				i ++;
			}
		} catch (FileNotFoundException e) {
			System.err.println("Archivo inexistente");
		} catch (IOException e) {
			System.err.println("Error al leer el archivo");
		} catch (ErrorLexicoExcepcion e) {
			System.err.println(e.toString());
		}
	}
}